package asem.ast.expresiones;

import genc.GenC;
import alex.Token;
import asem.ast.sentencias.NodoBloque;
import asem.tablaSimbolos.tipo.Tipo;
import asem.tablaSimbolos.tipo.TipoBoolean;
import asem.tablaSimbolos.tipo.TipoChar;
import asem.tablaSimbolos.tipo.TipoNull;
import asem.tablaSimbolos.tipo.TipoString;

public class NodoLiteral extends NodoOperando {
	protected static int cantStrings = 0;
	protected Token literal;
	protected Tipo tipo;

	public NodoLiteral(Token token, Tipo t) {
		literal = token;
		tipo = t;
	}

	@Override
	public Tipo chequeoSentencias(NodoBloque contenedor) {
		if (tipo.compatible(TipoBoolean.TIPO)) {
			if (literal.getLexema().equals("true"))
				GenC.gen.push("1", "Apilamos el equivalente a true");
			else
				GenC.gen.push("0", "Apilamos el equivalente a false");

			return tipo;
		}

		if (tipo.compatible(TipoString.TIPO)) {
			char comilla = '"';
			String etiq = "_String_" + cantStrings++;
			GenC.gen.crearString(etiq, comilla + literal.getLexema() + comilla
					+ ",0");

			return tipo;
		}

		if (tipo.compatible(TipoChar.TIPO)) {

			switch (literal.getLexema()) {
			case "\\t":
				GenC.gen.push("09", "TAB");
				break;
			case "\\n":
				GenC.gen.push("10", "Salto de linea");
				break;
			default:
				GenC.gen.push(
						"'" + literal.getLexema() + "'",
						"Apilamos el valor del literal char, "
								+ literal.getLexema());
			}

			return tipo;
		}

		if (tipo.equals(TipoNull.TIPO)) {
			GenC.gen.push("0", "Apilo null");
			return tipo;
		}

		GenC.gen.push(literal.getLexema(), "Apilamos el valor del literal "
				+ literal.getLexema());
		return tipo;
	}
}
